]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
PopupMenuManager: only navigate visible menus
authorGiovanni Campagna <gcampagna@src.gnome.org>
Thu, 30 Dec 2010 14:22:54 +0000 (15:22 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Thu, 6 Jan 2011 18:54:28 +0000 (19:54 +0100)
When doing keyboard navigation, ignore menus whose sourceActor is
hidden.
This is needed to hide status icons, as otherwise the menu would
appear despite having no icon.

https://bugzilla.gnome.org/show_bug.cgi?id=638306

js/ui/popupMenu.js

index 91b412c03d241e9ab5c6e55d26a1a52aafba1b62..30f353eb35200c2c1937b0b65a9e9b3a065f7564 100644 (file)
@@ -1194,6 +1194,18 @@ PopupMenuManager.prototype = {
         return -1;
     },
 
+    _nextMenu: function(pos, direction) {
+        for (let i = 1; i < this._menus.length; i++) {
+            let candidate = mod(pos + i * direction, this._menus.length);
+            let menu = this._menus[candidate].menu;
+            if (!menu.sourceActor || menu.sourceActor.visible)
+                return menu;
+        }
+        // no menu is found? this should not happen
+        // anyway stay on current menu
+        return this._menus[pos];
+    },
+
     _onEventCapture: function(actor, event) {
         if (!this.grabbed)
             return false;
@@ -1232,7 +1244,7 @@ PopupMenuManager.prototype = {
         if (symbol == Clutter.Left || symbol == Clutter.Right) {
             let direction = symbol == Clutter.Right ? 1 : -1;
             let pos = this._findMenu(this._activeMenu);
-            let next = this._menus[mod(pos + direction, this._menus.length)].menu;
+            let next = this._nextMenu(pos, direction);
             if (next != this._activeMenu) {
                 this._changeMenu(next);
                 next.activateFirst();